﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Reflection;

namespace CRM.Admin
{
    public static class EnumHelper
    {
        
        public static string GetDescription<TEnum>(TEnum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            var attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

            return (attributes.Length > 0) ? attributes[0].Description : value.ToString();
        }

        public static T GetEnumValueFromDescription<T>(string description)
        {
            var type = typeof(T);
            if (!type.IsEnum)
                throw new ArgumentException();
            FieldInfo[] fields = type.GetFields();
            var field = fields.SelectMany(f => f.GetCustomAttributes(typeof(DescriptionAttribute), false), (f, a) => new { Field = f, Att = a })
                .SingleOrDefault(a => ((DescriptionAttribute)a.Att).Description == description);
            if (field != null) return (T)field.Field.GetRawConstantValue();
            throw new Exception("Không tồn tai enum có mô tả là " + description);
        }

        public static Hashtable GetEnumForBind(Type enumeration)
        {
            string[] names = Enum.GetNames(enumeration);
            Array values = Enum.GetValues(enumeration);
            var ht = new Hashtable();
            for (int i = 0; i < names.Length; i++)
            {
                ht.Add(Convert.ToInt32(values.GetValue(i)).ToString(CultureInfo.InvariantCulture), names[i]);
            }
            return ht;
        }
        //public static SelectList ToSelectList<TEnum>(this TEnum enumObj)
        //{
        //    var values = from TEnum e in Enum.GetValues(typeof(TEnum))
        //                 select new { Id = (int)Enum.Parse(typeof(TEnum), e.ToString()), Name = e.ToString() };

        //    return new SelectList(values, "Id", "Name", (int)Enum.Parse(typeof(TEnum), enumObj.ToString()));
        //}

        public static IEnumerable<UnitShortModel> GetDescriptionForBind<TEnum>(TEnum enumValue)
        {
            if (!typeof(TEnum).IsEnum) return null;

            var a = (from TEnum e in Enum.GetValues(typeof(TEnum))
                     select new UnitShortModel()
                     {
                         Name = e.ToString(),
                         ValueInt = Convert.ToInt32(e),
                         ValueString = GetDescription(e)
                     }).OrderBy(x => x.ValueInt);
            return a;
        }

        ////////
        
    }
    public static class Utility
    {
        public static DataTable ConvertToDataTable<T>(IList<T> data)
        {
            PropertyDescriptorCollection properties =
               TypeDescriptor.GetProperties(typeof(T));
            DataTable table = new DataTable();
            foreach (PropertyDescriptor prop in properties)
                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
            foreach (T item in data)
            {
                DataRow row = table.NewRow();
                foreach (PropertyDescriptor prop in properties)
                    row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                table.Rows.Add(row);
            }
            return table;

        }
        public static DataTable ConvertToDataTable<T>(List<T> data)
        {
            PropertyDescriptorCollection properties =
               TypeDescriptor.GetProperties(typeof(T));
            DataTable table = new DataTable();
            foreach (PropertyDescriptor prop in properties)
                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
            foreach (T item in data)
            {
                DataRow row = table.NewRow();
                foreach (PropertyDescriptor prop in properties)
                    row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                table.Rows.Add(row);
            }
            return table;

        }
    }

    public enum Ttdv_NamTaiChinh
    { 
        [Description("01/01")]
        N0101 = 1,
        [Description("01/04")]
        N0104 = 4,
        [Description("01/07")]
        N0107 = 7,
        [Description("01/10")]
        N0110 = 10,        
    }
   
    public enum Ttdv_LoaiHinhKD
    {
        [Description("Ngành hàng sản xuất, kinh doanh thông thường")]
        KD1 = 1,
        [Description("Tự hoạt động thăm dò, phát triển mỏ và khai thác dầu, khí thiên nhiên")]
        KD2 = 2,
        [Description("Từ hoạt động xổ số kiến thiết của các công ty xổ số kiến thiết")]
        KD3 = 3,
        [Description("Tổ chức được giao thu phí, lệ phí thuộc ngân sách Nhà nước")]
        KD4 = 4,
        [Description("Ngân hàng")]
        KD5 = 5,
        
    }

    public enum BHXH_Loai_DSLD
    {
        [Description("Đã bị thu hồi")]
        Loai1 = 1,
        [Description("Mất sổ")]
        Loai2 = 2,
        [Description("Có sổ BHXH")]
        Loai3 = 3,        
    }

    public enum DanToc
    {
        [Description("Kinh")]
        DT1 = 1,
        [Description("Tày")]
        DT2 = 2,
        [Description("Thái")]
        DT3 = 3,
        [Description("Hoa")]
        DT4 = 4,
        [Description("Khơ-me")]
        DT5 = 5,
        [Description("Mường")]
        DT6 = 6,
        [Description("Nùng")]
        DT7 = 7,
        [Description("Hmông")]
        DT8 = 8,
        [Description("Dao")]
        DT9 = 9,
        [Description("Gia-rai")]
        DT10 = 10,
    }

    public enum QuocTich
    {
        [Description("Việt Nam")]
        QT1 = 1,
        [Description("England")]
        QT2 = 2,
        [Description("Laos")]
        QT3 = 3,
        [Description("China")]
        QT4 = 4,
        [Description("Cambodia")]
        QT5 = 5,
        [Description("Cambodia")]
        QT6 = 6,
        [Description("Cambodia")]
        QT7 = 7,
        [Description("Cambodia")]
        QT8 = 8,
        [Description("Cambodia")]
        QT9 = 9,
        [Description("Cambodia")]
        QT10 = 10,        
    }

    public enum Loai_HopDong_A01TS
    {
        [Description("< 1 năm")]
        LHD1 = 1,
        [Description(">= 1 năm")]
        LHD2 = 2,
    }

    public enum ReminderTime
    {
        [Description("--None--")]
        NONE = -1,
        [Description("1 minute prior")]
        MIN1 = 60,
        [Description("5 minute prior")]
        MIN5 = 300,
        [Description("10 minute prior")]
        MIN10 = 600,
        [Description("15 minute prior")]
        MIN15 = 900,
        [Description("30 minute prior")]
        MIN30 = 1800,
        [Description("1 hour prior")]
        HOUR1 = 3600,
        [Description("2 hour prior")]
        HOUR2 = 7200,
        [Description("1 day prior")]
        DAY1 = 86400,
        [Description("2 day prior")]
        DAY2 = 172800,
    }


    public class UnitShortModel
    {
        public string Name { get; set; }

        public string ValueString { get; set; }

        public int ValueInt { get; set; }
    }
}